//
//  ViewController+Network.swift
//  YS
//
//  Created by 元穗 on 2017/5/23.
//  Copyright © 2017年 yuansui. All rights reserved.
//

import Foundation
import HandyJSON
// 网络操作协议

public protocol NetworkOpt {
    /// 执行网络请求
    ///
    /// - Parameters:
    ///   - id: 编号
    ///   - req: 请求
    func exeNetworkReq(id: Int, req: NetworkReq);
    func exeNetworkReq<T: HandyJSON>(id: Int, req: NetworkReq, model: T);

    /// 执行网络请求(使用默认id)
    ///
    /// - Parameter req: 请求
    func exeNetworkReq(req: NetworkReq);
    func exeNetworkReq<T: HandyJSON>(req: NetworkReq, model: T)

    /// 可以自行设置重试次数及超时时间, 多用于一些需要不断重试的任务
    ///
    /// - Parameters:
    ///   - id: 编号
    ///   - req:
    ///   - listener:
    func exeNetworkReq(id: Int, req: NetworkReq, listener: OnNetworkListener);
    func exeNetworkReq<T: HandyJSON>(id: Int, req: NetworkReq, listener: OnNetworkListener, model: T);
    
    /// 取消所有网络任务
    func cancelAllNetworkReq();


    /// 取消单个网络任务
    ///
    /// - Parameter id: 编号
    func cancelNetworkReq(id: Int);
}

/// 网络任务监听

public protocol OnNetworkListener {
    /// 任务数据回调
    ///
    /// - Parameters:
    ///   - id: 编号
    ///   - resp: 返回的数据
    /// - Returns: 任意类型
    func onNetworkResponse<T: HandyJSON>(id: Int, resp: NetworkResp, model: T) -> AnyObject?;

    /// 任务成功
    ///
    /// - Parameters:
    ///   - id: 编号
    ///   - result: 解析后的数据
    func onNetworkSuccess(id: Int, result: AnyObject?);

    /// 任务失败
    ///
    /// - Parameters:
    ///   - id: 编号
    ///   - err: 错误
    func onNetworkErr<T:NetworkErr>(id: Int, err: T);

    /// 任务下载或上传的进度
    ///
    /// - Parameters:
    ///   - id: 编号
    ///   - progress: 进度
    ///   - total: 文件总大小
    func onNetworkProgress(id: Int, progress: Float, total: Int);
    
    
    /// 网络错误
    func onNetworkDisable(_ code: NetDisableCode);
}





